#!/usr/bin/perl -w -CSDA
use v5.14;
use strict;
use warnings;
use utf8;

use CGI::Fast qw/header param/;
use CGI::Fast qw/Vars/;
use Data::Dumper;
use Email::Simple;
use Email::Sender::Simple qw/sendmail/;
use File::Slurp qw/append_file/;
use JSON qw/encode_json/;
use YAML::Any qw/Dump LoadFile/;

use Fcntl qw/LOCK_EX LOCK_UN/;
use List::Util qw/sum/;

##################################################

use constant EMAIL_FROM => 'Înscrieri ca membri voluntari în Fundația Ceata <voluntariat@ceata.org>';
use constant ADMIN_EMAIL => 'voluntariat@ceata.org';
use constant DATAFILE => 'date.yml';
# Sfarsit setari

##################################################

open LOCK, '<', DATAFILE;

sub append{
  flock LOCK, LOCK_EX;

  eval {
	my $prenume = param('prenume') or die 'Nu ați completat prenumele';
	utf8::decode($prenume);
	my $nume = param('nume') or die 'Nu ați completat numele';
	utf8::decode($nume);
	my $adresa = param('adresa') or die 'Nu ați completat adresa de poștă electronică';
	utf8::decode($adresa);
	my $telefon = param('telefon') or die 'Nu ați completat telefonul';
	utf8::decode($telefon);
	my $cnp = param('cnp') or die 'Nu ați completat codul numeric personal';
	utf8::decode($cnp);
	my $oras = param('oras') or die 'Nu ați completat orașul în care locuiți';
	utf8::decode($oras);
	my $judet = param('judet') or die 'Nu ați completat județul/raionul/statul în care locuiți';
	utf8::decode($judet);
	my $tara = param('tara') or die 'Nu ați completat țara în care locuiți';
	utf8::decode($tara);
	my $descriere = param('descriere') or die 'Nu ați completat descrierea';
	utf8::decode($descriere);
	my $poza = param('poza') or '';
	utf8::decode($poza);

	my (undef, undef, undef, $mday, $mon, $year) = localtime;
	my ($cmday, $cmon, $cyear) = (10, 5, 108);
	my $nanniv = $year - $cyear + 1 - (($mon - $cmon || $mday - $cmday) < 0);
	my $captcha = param('captcha') or die 'Nu ați răspuns la întrebarea de test despre aniversarea proiectului Ceata.';
	die 'Răspuns greșit la întrebarea de test despre aniversarea proiectului Ceata. Recitiți introducerea.' unless $captcha == $nanniv;

	my $referinta = param('referinta') || param('referinta2');
	my $anunturi = param('anunturi') or 0;
	my @db = LoadFile DATAFILE;
	die 'Această adresă de poștă electronică este deja folosită' if grep { $_->{adresa} eq $adresa } @db;

	my $entry = Dump {
	  prenume => $prenume,
	  nume => $nume,
	  adresa => $adresa,
	  telefon => $telefon,
	  cnp => $cnp,
	  oras => $oras,
	  judet => $judet,
	  tara => $tara,
	  descriere => $descriere,
	  poza => $poza,
	  referinta => $referinta,
	  anunturi => defined($anunturi) && $anunturi ? 1 : 0,
	};
	append_file DATAFILE, $entry;
	utf8::decode($entry);
	my $success_email = Email::Simple->create(
	  header => [
		To => "$nume <$adresa>",
		Subject => 'Confirmarea de înscriere ca membru voluntar în Fundația Ceata',
		From => EMAIL_FROM,
	  ],
	  body => "Aceasta este o confirmare automată de înscriere ca membru voluntar în Fundația Ceata. În scurt timp te vom contacta în legătură cu finalizarea procedurii.\n\n$entry"
	);
	sendmail $success_email, { charset => 'utf-8', to => [$adresa, ADMIN_EMAIL]};
  };

  flock LOCK, LOCK_UN;
  if ($@) {
	my $eroare = $@ =~ s/ at .*//r;
	my $error_email = Email::Simple->create(
	  header => [
		To => "Administrator <" . ADMIN_EMAIL . ">",
		Subject => 'Eroare de înscriere ca membru voluntar în Fundația Ceata',
		From => EMAIL_FROM,
	  ],
	  body => "Eroare: $eroare\n" . Dumper scalar Vars,
	);
	sendmail $error_email;
	print header('text/html; charset=utf-8', '500 Internal Server Error');
	print $eroare;
  } else {
	print header('text/html; charset=utf-8');
	print 'Ați fost înscris cu succes';
  }
}

while (CGI::Fast->new) {
  my $op = param 'op' // '';
  append if $op eq 'append';
}

1;
__END__

=head1 NAME

hgcj - Formular de înscriere în Fundația Ceata

=head1 AUTHORS

Marius Gavrilescu E<lt>marius@ieval.roE<gt>
Tiberiu C. Turbureanu E<lt>tct@ceata.org<gt>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2013 Fundația Ceata

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.


=cut
